import re


def simple():
    result = re.match('wangdao', 'wangdao.com')  # 不写规则，默认单字匹配
    if result:
        print(result.group())


def single():
    '''
    .匹配单个字符，[]范围,'\\d' 匹配数字（单个）
    :return:
    '''
    ret = re.match('.', 'M')  # .可匹配任意字符
    print(ret.group())

    ret = re.match('t.o', 'too')
    print(ret.group())

    ret = re.match('t.o', 'two')
    print(ret.group())

    ret = re.match('[pP]', 'python')
    print(ret.group())

    ret = re.match('[pP]', 'Python')
    print(ret.group())

    ret = re.match('[0-9]python', '7python')
    print(ret.group())
    #                     单字匹配，他知道不是35 而是0-3，5-9，不能匹配4
    ret = re.match('[0-35-9]Python', '5Python')
    print(ret.group())

    ret = re.match(r'\d', '5Python')  # \d匹配数字
    print(ret.group())


def more_alp():
    '''
    匹配多个字符,* 0次或无限次前面表达式的内容即可有可无，+ 至少一次，? 最多一次，{m} m次，{m,n} m到n次
    :return:
    '''
    ret = re.match('[A-Z][a-z]*', 'Cccabed')
    print(ret.group())
    ret = re.match('[a-z]*', 'cccabEd')
    print(ret.group())
    print('-' * 50)

    names = ['name1', '_name2', '2_name3', '__name__']
    for name in names:  # +至少一次 *无限制次数
        ret = re.match(r'[a-zA-Z_]+\w*', name)  # \w就是字母数字下划线
        if ret:
            print(f'{name}是正确的')
        else:
            print(f'{name}不符合命名规范')
    print('-' * 50)

    #                      实际上是后面这个匹配的，?表示可以不出现
    ret = re.match('[1-6]?[0-7]', '7')
    print(ret.group())

    ret = re.match(r'[1-9]?\d', '33')
    print(ret.group())

    #                        [1-9]可以不匹配  0和\d匹配
    ret = re.match(r'[1-9]?\d', '09')
    print(ret.group())

    print('-' * 50)  # 只能匹配5个 因为第6个是*
    ret = re.match(r'[a-zA-Z0-9_]{5}', '112a3*asda')
    print(ret.group())

    # 如果至少有8个正确匹配，就一直到不能匹配的地方或上限
    ret = re.match(r'[a-zA-Z0-9_]{8,20}', '12131312312*44134113')
    print(ret.group())


def start_end():
    '''
    匹配开头和结尾
    :return:
    '''
    # 符合163的邮箱匹配出来 注意：@前至少4-20位
    email_list = ['xiaoWang@163.com', '1301491469@qq.com', 'xiaowang@163.comheihei', '123@163.com']
    for email in email_list:  # .需要转义，否则任意字符可匹配
        ret = re.match(r'[a-zA-Z0-9]{4,20}@163\.com$', email)  # $结尾 ^开头
        if ret:
            print(f'{email}是163邮箱')
        else:
            print(f'{email}不是163邮箱')

    print('-' * 50)

    # 匹配0-99
    # 若没有十位，则[1-9]?可不匹配，个位由\d匹配，此时可以匹配0-9,用$结束，否则会09会匹配成功0
    ret = re.match(r'[1-9]?\d$', '0')
    print(ret.group())


def split_group():
    '''
    匹配分组
    :return:
    '''
    # 匹配0-100  | 或     即0-99的匹配|100
    ret = re.match(r'[1-9]?\d$|100', '0')
    if ret:
        print('匹配0-100成功', ret.group())
    else:
        print('不在0-100之间')

    # 匹配1-99    10-99和1-9分开匹配
    ret = re.match(r'[1-9][0-9]$|[1-9]$', '9')
    if ret:
        print('匹配1-99成功', ret.group())
    else:
        print('不在1-99之间')

    print('-' * 50)
    ret = re.match(r'\w{4,20}@(163|126|qq)\.com$', '1301491469@qq.com')
    print(ret.group())

    print('-' * 50)  # 没遇到-一直吃，设置好的 [^- 匹配不是-的任意字符]*任意多个  ()捕获组
    ret = re.match(r'([^-]*)-(\d+)', '010-12345678')
    print(ret.group())
    print(ret.group(1))
    print(ret.group(2))

    print('-' * 50)
    # 完成对正确的字符串的匹配   前面是<html>后面是<htmla>也会错误匹配
    ret = re.match(r'<[a-zA-Z]*>\w*</[a-zA-Z]*>', '<html>hh</htmla>]')
    print(ret.group())
    # \1表示此位置和前面第1个()位置必须一样  但数量多时不方便
    ret = re.match(r'<([a-zA-Z]*)>\w*</\1>', '<html>hh</html>]')
    print(ret.group())
    print('-' * 50)
    # (?P<name>)(?P=name)  注意，这里的<>是语法要求而不是html的<>
    ret = re.match(r'<(?P<name1>\w*)>\w*</(?P=name1)>', '<html>hh</html>')
    print(ret.group())


def other_func():
    '''
    search  findall  sub  split
    :return:
    '''
    ret = re.search(r'\d+', '阅读次数9999,点赞8888')  # search只能拿一个
    print(ret.group())
    ret = re.findall(r'\d+', '阅读次数9999,点赞8888')  # findall拿全部
    print(ret)


def use_iter():
    pattern = r'\d+'
    text = 'abd123bdc2341adsd2323'
    second_match = find_second_match(pattern, text)
    print(second_match)


def find_second_match(pattern, text):
    matches = re.finditer(pattern, text)  # 迭代器
    try:
        next(matches)  # 跳过第一个匹配项,没拿
        second_match = next(matches)  # 获取第二个匹配项
        return second_match.group()
    except StopIteration:
        return None


def use_sub():
    ret = re.sub(r'\d+', '1000', '播放量1090')
    print(ret)

    ret = re.sub(r'\d+', lambda x: str(int(x.group()) + 100), '播放量1090')
    print(ret)


if __name__ == '__main__':
    # simple()
    # single()
    # more_alp()
    # start_end()
    # split_group()
    # other_func()

    use_sub()
